package com.ux.collection
{
	import com.ux.util.DisplayObjUtil;
	import com.ux.util.VectorUtil;
	
	import flash.display.DisplayObjectContainer;

	/**
	 * @author winnie
	 */	
	public class ListCollection
	{
		
		private var _list:Vector.<Object> = new Vector.<Object>();
		
		/**
		 * ListCollection
		 */		
		public function ListCollection( _list:Array = null )
		{
			if( _list )
			{
				var len:int = _list.length;
				for (var i:int = 0; i < len; i++)
				{
					addListAt( _list[ i ], i );
				}
			}
		}
		
		
		/**
		 * @param btn IList 를 구현한 리스트
		 */		
		public function addList( btn : Object ):ListCollection
		{
			addListAt( btn, _list.length );
			
			return this;
		}
		
		
		/**
		 * @param btn IList 를 구현한 리스트 제거
		 */
		public function removeList( btn : Object ):ListCollection
		{
			_list.fixed = false;
			_list.splice( _list.lastIndexOf( btn ), 1 );
			_list.fixed = true;
			
			return this;
		}
		
		
		/**
		 * @param obj 리스트
		 * @return IList 을 구현한 리스트 반환
		 */		
		public function getListAtObj( obj:Object ):Object
		{
			return _list[ _list.indexOf( obj ) ];
		}
		
		
		/**
		 * @param idx 리스트 인덱스
		 * @return IList 을 구현한 리스트 반환
		 */		
		public function getListAt( idx:int ):Object
		{
			return _list[ idx ];
		}
		
		/**
		 * @param obj 리스트
		 * @return IList 을 구현한 리스트 반환
		 */		
		public function getListIndex( obj:Object ):int
		{
			return _list.indexOf( obj );
		}
		
		
		/**
		 * @param btn 끼워넣을 리스트
		 * @param idx 리스트의 인덱스 값
		 */		
		public function addListAt( obj:Object, idx:int ):ListCollection
		{
			_list.fixed = false;
			_list.splice( idx, 0, obj );
			_list.fixed = true;
			
			return this;
		}
		
		
		/**
		 * @param btn 끼워넣을 리스트
		 * @param idx 리스트의 인덱스 값
		 */		
		public function addListAfterObj( insertObj:Object, compareObj:Object ):ListCollection
		{
			var idx : int = _list.indexOf( compareObj );
			_list.fixed = false;
			_list.splice( idx, 0, insertObj );
			_list.fixed = true;
			
			return this;
		}
		
		
		/**
		 * [ 읽기전용 ]
		 * @return 리스트 통째 반환 
		 */		
		public function get list():Vector.<Object>
		{
			return _list;
		}
		
		
		/**
		 * @param fn Object 파라미터를 포함하는 Function
		 */		
		public function foreach( _fn:Function ):ListCollection
		{
			var len:int = _list.length;
			for (var i:int = 0; i < len; i++) 
			{
				_fn( _list[ i ] );
			}
			
			return this;
		}
		
		
		/**
		 * @param _container : 가져올 객체의 부모 컨테이너
		 * @param _name : 가져올 객체의 인스턴스 네임중 포함하고 있는 name
		 * @return ListCollection 객체 = this  
		 */		
		public function makeListFromContainer( _container:DisplayObjectContainer, _name : String ):ListCollection
		{
			DisplayObjUtil.makeList( _container, _name, _list );
			_list.sort( VectorUtil.sortLastNameCompare );
			return this;
		}
		
		
		
	}
}










